package io.github.echarts.option.series;

import java.util.ArrayList;
import java.util.List;


import io.github.echarts.option.style.ItemStyle;
import io.github.echarts.option.style.LabelStyle;

/**
 * 矩形树图配置类。
 * 矩形树图是一种展示层级数据的可视化方式，其特点是用矩形的面积表示数据的大小。
 */

public class TreemapSeries extends SeriesOption {
    
    private static final long serialVersionUID = 1L;
    
    private Integer visibleMin = 10; // 显示的最小数据量
    private Integer childrenVisibleMin = 10; // 子节点显示的最小数据量
    private List<LevelOption> levels = new ArrayList<>(); // 多层级样式设置
    private Double left = 80.0; // 组件离容器左侧的距离
    private Double top = 60.0; // 组件离容器上侧的距离
    private Double right = 80.0; // 组件离容器右侧的距离
    private Double bottom = 60.0; // 组件离容器下侧的距离
    private Double width; // 组件宽度
    private Double height; // 组件高度
    private Boolean roam = false; // 是否开启缩放漫游功能，默认关闭（服务端渲染不需要）
    private Double zoomToNodeRatio = 0.32; // 点击节点后的缩放比例
    private ItemStyle itemStyle; // 矩形样式
    private LabelStyle label; // 标签样式
    private LabelStyle upperLabel; // 父节点标签样式
    private List<TreemapDataItem> treemapData = new ArrayList<>(); // 数据项列表
    
    /**
     * 创建一个矩形树图配置实例。
     */
    public TreemapSeries() {
        super();
        this.setType("TREEMAP");
    }
    
    /**
     * 设置显示的最小数据量，小于这个数据量的节点不显示。
     *
     * @param visibleMin 最小数据量
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setVisibleMin(Integer visibleMin) {
        this.visibleMin = visibleMin;
        return this;
    }
    
    /**
     * 获取显示的最小数据量。
     *
     * @return 最小数据量
     */
    public Integer getVisibleMin() {
        return this.visibleMin;
    }
    
    /**
     * 设置子节点显示的最小数据量，小于这个数据量的子节点不显示。
     *
     * @param childrenVisibleMin 子节点最小数据量
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setChildrenVisibleMin(Integer childrenVisibleMin) {
        this.childrenVisibleMin = childrenVisibleMin;
        return this;
    }
    
    /**
     * 获取子节点显示的最小数据量。
     *
     * @return 子节点最小数据量
     */
    public Integer getChildrenVisibleMin() {
        return this.childrenVisibleMin;
    }
    
    /**
     * 添加层级配置。
     *
     * @param level 层级配置
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries addLevel(LevelOption level) {
        this.levels.add(level);
        return this;
    }
    
    /**
     * 获取所有层级配置。
     *
     * @return 层级配置列表
     */
    public List<LevelOption> getLevels() {
        return this.levels;
    }
    
    /**
     * 设置组件离容器左侧的距离。
     *
     * @param left 左侧距离
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setLeft(Double left) {
        this.left = left;
        return this;
    }
    
    /**
     * 获取组件离容器左侧的距离。
     *
     * @return 左侧距离
     */
    public Double getLeft() {
        return this.left;
    }
    
    /**
     * 设置组件离容器上侧的距离。
     *
     * @param top 上侧距离
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setTop(Double top) {
        this.top = top;
        return this;
    }
    
    /**
     * 获取组件离容器上侧的距离。
     *
     * @return 上侧距离
     */
    public Double getTop() {
        return this.top;
    }
    
    /**
     * 设置组件离容器右侧的距离。
     *
     * @param right 右侧距离
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setRight(Double right) {
        this.right = right;
        return this;
    }
    
    /**
     * 获取组件离容器右侧的距离。
     *
     * @return 右侧距离
     */
    public Double getRight() {
        return this.right;
    }
    
    /**
     * 设置组件离容器下侧的距离。
     *
     * @param bottom 下侧距离
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setBottom(Double bottom) {
        this.bottom = bottom;
        return this;
    }
    
    /**
     * 获取组件离容器下侧的距离。
     *
     * @return 下侧距离
     */
    public Double getBottom() {
        return this.bottom;
    }
    
    /**
     * 设置组件宽度。
     *
     * @param width 宽度
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setWidth(Double width) {
        this.width = width;
        return this;
    }
    
    /**
     * 获取组件宽度。
     *
     * @return 宽度
     */
    public Double getWidth() {
        return this.width;
    }
    
    /**
     * 设置组件高度。
     *
     * @param height 高度
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setHeight(Double height) {
        this.height = height;
        return this;
    }
    
    /**
     * 获取组件高度。
     *
     * @return 高度
     */
    public Double getHeight() {
        return this.height;
    }
    
    /**
     * 设置缩放比例。
     *
     * @param zoomToNodeRatio 缩放比例
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setZoomToNodeRatio(Double zoomToNodeRatio) {
        this.zoomToNodeRatio = zoomToNodeRatio;
        return this;
    }
    
    /**
     * 获取缩放比例。
     *
     * @return 缩放比例
     */
    public Double getZoomToNodeRatio() {
        return this.zoomToNodeRatio;
    }
    
    /**
     * 设置矩形样式。
     *
     * @param itemStyle 矩形样式
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setItemStyle(ItemStyle itemStyle) {
        this.itemStyle = itemStyle;
        return this;
    }
    
    /**
     * 获取矩形样式。
     *
     * @return 矩形样式
     */
    public ItemStyle getItemStyle() {
        return this.itemStyle;
    }
    
    /**
     * 设置标签样式。
     *
     * @param label 标签样式
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setLabel(LabelStyle label) {
        this.label = label;
        return this;
    }
    
    /**
     * 获取标签样式。
     *
     * @return 标签样式
     */
    public LabelStyle getLabel() {
        return this.label;
    }
    
    /**
     * 设置父节点标签样式。
     *
     * @param upperLabel 父节点标签样式
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries setUpperLabel(LabelStyle upperLabel) {
        this.upperLabel = upperLabel;
        return this;
    }
    
    /**
     * 获取父节点标签样式。
     *
     * @return 父节点标签样式
     */
    public LabelStyle getUpperLabel() {
        return this.upperLabel;
    }
    
    /**
     * 添加数据项。
     *
     * @param name 名称
     * @param value 值
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries addData(String name, Number value) {
        TreemapDataItem dataItem = new TreemapDataItem(name, value);
        this.treemapData.add(dataItem);
        updateData();
        return this;
    }
    
    /**
     * 添加带子节点的数据项。
     *
     * @param name 名称
     * @param children 子节点
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries addData(String name, List<TreemapDataItem> children) {
        TreemapDataItem dataItem = new TreemapDataItem(name, children);
        this.treemapData.add(dataItem);
        updateData();
        return this;
    }
    
    /**
     * 添加数据项。
     *
     * @param dataItem 数据项
     * @return 当前实例，用于链式调用
     */
    public TreemapSeries addData(TreemapDataItem dataItem) {
        this.treemapData.add(dataItem);
        updateData();
        return this;
    }
    
    /**
     * 更新基类的data数组，确保兼容性。
     */
    private void updateData() {
        Object[] dataArray = new Object[this.treemapData.size()];
        for (int i = 0; i < this.treemapData.size(); i++) {
            dataArray[i] = this.treemapData.get(i);
        }
        super.setData(dataArray);
    }
    
    /**
     * 获取矩形树图特定的数据列表。
     *
     * @return 矩形树图数据列表
     */
    public List<TreemapDataItem> getTreemapData() {
        return this.treemapData;
    }
    
    /**
     * 矩形树图层级配置选项。
     * 用于配置不同层级节点的样式。
     */
    public static class LevelOption {
        private Integer depth; // 层级深度，从0开始
        private ItemStyle itemStyle; // 该层级的矩形样式
        private LabelStyle label; // 该层级的标签样式
        
        /**
         * 创建一个层级配置实例。
         * 
         * @param depth 层级深度
         */
        public LevelOption(Integer depth) {
            this.depth = depth;
        }
        
        /**
         * 获取层级深度。
         *
         * @return 层级深度
         */
        public Integer getDepth() {
            return this.depth;
        }
        
        /**
         * 设置层级的矩形样式。
         *
         * @param itemStyle 矩形样式
         * @return 当前实例，用于链式调用
         */
        public LevelOption setItemStyle(ItemStyle itemStyle) {
            this.itemStyle = itemStyle;
            return this;
        }
        
        /**
         * 获取层级的矩形样式。
         *
         * @return 矩形样式
         */
        public ItemStyle getItemStyle() {
            return this.itemStyle;
        }
        
        /**
         * 设置层级的标签样式。
         *
         * @param label 标签样式
         * @return 当前实例，用于链式调用
         */
        public LevelOption setLabel(LabelStyle label) {
            this.label = label;
            return this;
        }
        
        /**
         * 获取层级的标签样式。
         *
         * @return 标签样式
         */
        public LabelStyle getLabel() {
            return this.label;
        }
    }
    
    /**
     * 矩形树图数据项。
     * 表示树图中的一个节点。
     */
    public static class TreemapDataItem {
        private String name; // 节点名称
        private Number value; // 节点值
        private ItemStyle itemStyle; // 节点样式
        private LabelStyle label; // 节点标签样式
        private List<TreemapDataItem> children; // 子节点
        
        /**
         * 创建一个叶子节点数据项。
         *
         * @param name 节点名称
         * @param value 节点值
         */
        public TreemapDataItem(String name, Number value) {
            this.name = name;
            this.value = value;
        }
        
        /**
         * 创建一个带子节点的数据项。
         *
         * @param name 节点名称
         * @param children 子节点列表
         */
        public TreemapDataItem(String name, List<TreemapDataItem> children) {
            this.name = name;
            this.children = children;
        }
        
        /**
         * 设置节点样式。
         *
         * @param itemStyle 节点样式
         * @return 当前实例，用于链式调用
         */
        public TreemapDataItem setItemStyle(ItemStyle itemStyle) {
            this.itemStyle = itemStyle;
            return this;
        }
        
        /**
         * 获取节点样式。
         *
         * @return 节点样式
         */
        public ItemStyle getItemStyle() {
            return this.itemStyle;
        }
        
        /**
         * 设置节点标签样式。
         *
         * @param label 节点标签样式
         * @return 当前实例，用于链式调用
         */
        public TreemapDataItem setLabel(LabelStyle label) {
            this.label = label;
            return this;
        }
        
        /**
         * 获取节点标签样式。
         *
         * @return 节点标签样式
         */
        public LabelStyle getLabel() {
            return this.label;
        }
        
        /**
         * 添加子节点。
         *
         * @param child 子节点
         * @return 当前实例，用于链式调用
         */
        public TreemapDataItem addChild(TreemapDataItem child) {
            if (this.children == null) {
                this.children = new ArrayList<>();
            }
            this.children.add(child);
            return this;
        }
        
        /**
         * 获取节点名称。
         *
         * @return 节点名称
         */
        public String getName() {
            return this.name;
        }
        
        /**
         * 获取节点值。
         *
         * @return 节点值
         */
        public Number getValue() {
            return this.value;
        }
        
        /**
         * 获取子节点列表。
         *
         * @return 子节点列表
         */
        public List<TreemapDataItem> getChildren() {
            return this.children;
        }
    }
} 